<?php
namespace Zxf5115\Laravel\Local\Upload\Logics;

use Illuminate\Http\UploadedFile;
use Zxf5115\Laravel\Local\Upload\Utils\FileTypeUtil;
use Zxf5115\Laravel\Local\Upload\Services\Base64FileService;

/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * Base64文件上传逻辑处理类
 */
class Base64FileLogic
{
  /**
   * Base64文件服务类对象
   */
  private Base64FileService $fileService;


  /**
   * 构造方法注入依赖关系
   *
   * @param Base64FileService $logic 逻辑处理对象
   */
  public function __construct(Base64FileService $fileService)
  {
    $this->fileService = $fileService;
  }


  /**
   * Base64 格式文件上传
   *
   * @param string $file Base64 编码的文件数据
   * @param string $path 存储目录
   * @param string $filename 用户提供的文件名称
   * @param array $customAllow 自定义允许类型
   * @return string|array 上传结果
   */
  public function file(string $file, string $path = null, string $filename = '', array $customAllow = []) : string|array
  {
    try
    {
      $path = $path ?? 'file';

      // 根据上传类型获取允许的文件类型
      $allowTypes = FileTypeUtil::getAllowTypesByUploadType('file', $customAllow);

      $response = $this->fileService->file($file, $path, $allowTypes, $filename);

      return success($response);
    }
    catch(\Exception $e)
    {
      // 记录异常信息
      record($e);

      return error(__('kernel.upload_failure'));
    }
  }


  /**
   * Base64 格式图片上传
   *
   * @param string $file base64数据文件
   * @param string $path 存储目录
   * @param string $filename 用户提供的文件名称
   * @param array $customAllow 自定义允许类型
   * @return string|array 上传结果
   */
  public function picture(string $file, string $path = null, string $filename = '', array $customAllow = []) : string|array
  {
    $path = $path ?? 'picture';

    // 根据上传类型获取允许的文件类型
    $allowTypes = FileTypeUtil::getAllowTypesByUploadType('picture', $customAllow);

    return $this->fileService->file($file, $path, $allowTypes, $filename);
  }


  /**
   * Base64 格式批量上传富文本中的文件
   *
   * @param array $file base64数据文件数组
   * @param ?string $path 存储目录
   * @param array $customAllow 自定义允许类型
   * @return string|array 上传结果
   */
  public function batchRichTextFile(array $files, ?string $path, array $customAllow = []) : string|array
  {
    $path = $path ?? 'picture';

    // 根据上传类型获取允许的文件类型
    $allowTypes = FileTypeUtil::getAllowTypesByUploadType('rich_text', $customAllow);

    return $this->FileService->batchRichTextFile($file, $path, $allowTypes);
  }
}
